package com.springcloudalibaba.apiPay.util;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.Random;

/**
 * @描述: TODO 字符串工具类
 * @作者: lixing lixing_java@163.com
 * @日期 2019/10/10 21:21
 */
public class WxStrUtil {
    /**
     * @描述 数字字符串保留小数点
     * @作者 lixing
     * @日期 2021/7/8 14:44
     * @Param [numStr 数字字符串，num 保留小数点位数]
     * @return java.lang.String
     */
    public static String formatNumStr(String numStr, int num) {
        if (new BigDecimal(numStr).compareTo(new BigDecimal("1")) < 0) {
            return numStr;
        }
        DecimalFormat decimalFormat = null;
        if (0 == num) {
            decimalFormat = new DecimalFormat("0");
        } else if (1 == num) {
            decimalFormat = new DecimalFormat("0.0");
        } else if (2 == num) {
            decimalFormat = new DecimalFormat("0.00");
        } else {
            return numStr;
        }
        numStr = decimalFormat.format(new BigDecimal(numStr));
        return numStr;
    }

    /**
     * @描述 TODO 判断字符都是否有效
     * @作者 lixing
     * @日期 2019/2/15 23:35
     * @Param [str]
     * @return java.lang.Boolean
     */
    public static Boolean isEffective(String str) {
        return null != str && str.trim().length() > 0 && !"null".equalsIgnoreCase(str);
    }

    /**
     * @描述 TODO 获取指定数字内的随机数
     * @作者 lixing
     * @日期 2019/2/15 23:35
     * @Param [str]
     * @return java.lang.Boolean
     */
    public static Integer getRandomIntNum(Integer size) {
        return new Random().nextInt(size);
    }

    /**
     * @描述 字符串数组转化成以逗号分隔的字符串
     * @作者 lixing
     * @日期 2020/2/28 9:27
     * @Param [strs]
     * @return java.lang.String
     */
    public static String stringArrayToString(String[] stringArray) {
        if (stringArray == null || stringArray.length == 0) {
            return null;
        }
        StringBuilder stringBuffer = new StringBuilder();
        for (String s : stringArray) {
            stringBuffer.append(s).append(",");

        }
        String resultStr = stringBuffer.toString();
        if (resultStr.endsWith(",")) {
            resultStr = resultStr.substring(0, resultStr.length() - 1);
        }
        return resultStr;
    }

    /**
     * @描述 TODO 生成指定长度的字符串
     * @作者 lixing
     * @日期 2019/7/27 15:14
     * @Param [type Number（生成数字），String（生成字符），mix（生成数字和字符）, length 长度]
     * @return java.lang.String
     */
    public static String genRandomStr(String type, int length) {
        String allChar;
        if ("Number".equals(type)) {
            allChar = "0123456789";
        } else if ("String".equals(type)) {
            allChar = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
        } else {
            allChar = "0123456789abcdefghjklmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ";
        }
        StringBuilder buffer = new StringBuilder();
        for (int i = 0; i < length; i++) {
            buffer.append(allChar.charAt(new Random().nextInt(((allChar.length())))));
        }
        return buffer.toString();
    }

    /**
     * @描述 TODO 字符串首字母大写
     * @作者 lixing
     * @日期 2019/2/15 23:36
     * @Param [str]
     * @return java.lang.String
     */
    public String upperCaseForFirst(String str) {
        byte[] items = str.getBytes();
        items[0] = (byte) ((char) items[0] - 'a' + 'A');
        return new String( items );
    }

    /**
     * @描述 TODO 字符串首字母小写
     * @作者 lixing
     * @日期 2019/2/15 23:36
     * @Param [str]
     * @return java.lang.String
     */
    public String lowerCaseForFirst(String str) {
        byte[] items = str.getBytes();
        items[0] = (byte) ((char) items[0] - 'A' + 'a');
        return new String( items );
    }

    /**
     * @描述 TODO 求两个字符串数组的并集，利用set的元素唯一性
     * @作者 lixing
     * @日期 2019/2/15 23:36
     * @Param [arr1, arr2]
     * @return java.lang.String[]
     */
//    public String[] union(String[] arr1, String[] arr2) {
//        Set<String> set = new HashSet<>();
//        Collections.addAll( set, arr1 );
//        Collections.addAll( set, arr2 );
//        String[] result = {};
//        return set.toArray( result );
//    }

    /**
     * @描述 TODO 求两个字符串数组的交集
     * @作者 lixing
     * @日期 2019/2/15 23:36
     * @Param [arr1, arr2]
     * @return java.lang.String[]
     */
//    public String[] intersect(String[] arr1, String[] arr2) {
//        Map<String, Boolean> map = new HashMap<>();
//        LinkedList<String> list = new LinkedList<>();
//        for (String str : arr1) {
//            if (!map.containsKey( str )) {
//                map.put( str, Boolean.FALSE );
//            }
//        }
//        for (String str : arr2) {
//            if (map.containsKey( str )) {
//                map.put( str, Boolean.TRUE );
//            }
//        }
//        for (Map.Entry<String, Boolean> e : map.entrySet()) {
//            if (e.getValue().equals( Boolean.TRUE )) {
//                list.add( e.getKey() );
//            }
//        }
//        String[] result = {};
//        return list.toArray( result );
//    }

    /**
     * @描述 TODO 求两个字符串数组的差集
     * @作者 lixing
     * @日期 2019/2/15 23:36
     * @Param [arr1, arr2]
     * @return java.lang.String[]
     */
//    public String[] minus(String[] arr1, String[] arr2) {
//        LinkedList<String> list = new LinkedList<>();
//        LinkedList<String> history = new LinkedList<>();
//        String[] longerArr = arr1;
//        String[] shorterArr = arr2;
//        //找出较长的数组来减较短的数组
//        if (arr1.length > arr2.length) {
//            longerArr = arr2;
//            shorterArr = arr1;
//        }
//        for (String str : longerArr) {
//            if (!list.contains( str )) {
//                list.add( str );
//            }
//        }
//        for (String str : shorterArr) {
//            if (list.contains( str )) {
//                history.add( str );
//                list.remove( str );
//            } else {
//                if (!history.contains( str )) {
//                    list.add( str );
//                }
//            }
//        }
//        String[] result = {};
//        return list.toArray( result );
//    }

    /**
     * @描述 将字节流转化成字节数组
     * @作者 lixing
     * @日期 2021/6/30 13:15
     * @Param [inputStream]
     * @return byte[]
     */
    public static byte[] getByteArrayByInputStream(InputStream inputStream) throws IOException {
        byte[] data = null;
        try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
            byte[] buffer = new byte[1024];
            int len;
            while ((len = inputStream.read(buffer)) != -1) {
                byteArrayOutputStream.write(buffer, 0, len);
            }
            data = byteArrayOutputStream.toByteArray();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (inputStream != null) {
                inputStream.close();
            }
        }
        return data;
    }

}
